import torch
# 导入 PyG
import torch_geometric as pyg
# 图结构数据表示
from torch_geometric.data import Data

"""
torch_geometric.data的属性信息：
data.x：图节点的属性信息，比如社交网络中每个用户是一个节点，这个x可以表示用户的属性信息，维度为[num_nodes,num_node_features]
data.edge_index:COO格式的图节点连接信息，类型为torch.long,维度为[2,num_edges](具体包含两个列表，每个列表对应位置上的数字表示相应节点之间存在边连接，第一个列表是起点，第二个列表是终点）
data.edge_attr:图中边的属性信息，维度[num_edges,num_edge_features]
data.y:标签信息，根据具体任务，维度是不一样的，如果是在节点上的分类任务，维度为[num_edges,类别数],如果是在整个图上的分类任务，维度为[1,类别数]
data.pos:节点的位置信息（一般用于图结构数据的可视化）
"""

# 构建一个具有三个节点和四个边的未加权和无向图的简单示例。每个节点只包含一个特征：

# 边的连接信息
# 注意，无向图的边要定义两次
edge_index = torch.tensor(
    [
        # 这里表示节点0和1有连接，因为是无向图，那么1和0也有连接，上下对应着看
        [0, 1, 1, 2],
        [1, 0, 2, 1],
    ],
    # 指定数据类型
    dtype=torch.long
)
# 节点的属性信息
x = torch.tensor(
    [
        # 三个节点
        # 每个节点的属性向量维度为1
        [-1],
        [0],
        [1],
    ]
)
# 实例化为一个图结构的数据
data = Data(x=x, edge_index=edge_index)
# 查看图数据
print(data)
# 图数据中包含什么信息
print(data.keys)
# 查看节点的属性信息
print(data['x'])
# 节点数
print(data.num_nodes)
# 边数
print(data.num_edges)
# 节点属性向量的维度
print(data.num_node_features)
# 图中是否有孤立节点
print(data.has_isolated_nodes())
# 图中是否有环
print(data.has_self_loops())
# 是否是有向图
print(data.is_directed())
